<?php

/**
 * 支付宝插件
 */
class alipay_bank
{

	var $payment = array('alipay_account'=>'HLCW@onelinkplaza.com',//支付宝帐户
	'alipay_key'=>'naxju47o6ucoamj46qbje1581m5wamd4',//交易安全校验码
	'alipay_partner'=>'2088511040166662',//合作者身份ID
	'alipay_pay_method'=>'3',//选择接口类型
	);
	/*0 => '使用标准双接口',
	1 => '使用担保交易接口',
	2 => '使用即时到帐交易接口',
	3 => '支付宝网银'*/



	/**
     * 构造函数
     *
     * @access  public
     * @param
     *
     * @return void
     */
	function alipay_bank()
	{
	}

	/**
     * 生成支付代码
     * @param   array   $order      订单信息
     * @param   array   $payment    支付方式信息
     */
	function get_code($order)
	{

		$charset = 'utf-8';


		$data_order_id    = $order['trans_code'];//订单号
		$data_amount      = $order['trans_amount'];//充值金额
		$data_body        = $order['body'];//商品描述
		$data_notify_url  = $order['notify_url'];
		$data_return_url  = $order['return_url'];
		$data_pay_key     = $this->payment['alipay_key'];
		$data_pay_partner = $this->payment['alipay_partner'];
		$data_pay_account = $this->payment['alipay_account'];

		$real_method = $this->payment['alipay_pay_method'];

		switch ($real_method)
		{
			case '0':
				$service = 'trade_create_by_buyer';
				break;
			case '1':
				$service = 'create_partner_trade_by_buyer';
				break;
			case '2':
				$service = 'create_direct_pay_by_user';
				break;
			case '3':
				$service = 'create_direct_pay_by_user';
				break;
		}

		//$agent = 'C4335319945672464113';
		$parameter = array(
		//'agent'             => $agent,
		'service'           => $service,
		'partner'           => $data_pay_partner,
		'_input_charset'    => $charset,
		'notify_url'        => $data_notify_url,//异步通知接口
		'return_url'        => $data_return_url,//同步通知接口
		/* 业务参数 */
		'subject'           => '性福之家'.'('.$data_order_id.')',
		'out_trade_no'      => $data_order_id ,
		'total_fee'         => $data_amount,  //付款金额 $order['order_money']
		'body'              => '万菱家饰网订单'.'('.$data_order_id.')',
		'show_url'          => SITE_URL,
		'anti_phishing_key'	=> $this->query_timestamp(),//
		'exter_invoke_ip'	=> real_ip(),
		'payment_type'      => 1,
		'paymethod'			=> 'bankPay',//默认支付方式,必填
		'defaultbank'		=> $order['pay_bank'],//CMB 例如表示招商银行
		'seller_email'      => $data_pay_account
		);


		ksort($parameter);
		reset($parameter);

		$html = '';
		$html .= '<html>'."\n";
		$html .= '<head>'."\n";
		$html .= '<meta http-equiv="Content-Type" content="text/html; charset='.$charset.'" />'."\n";
		$html .= '<title>支付宝网银支付，正在跳转...</title>'."\n";
		$html .= '</head>'."\n";
		$html .= '<body onLoad="document.alipay_bank.submit();">'."\n";

		$sign  = '';
		$form_content = '';

		foreach ($parameter AS $key => $val)
		{
			//$param .= "$key=" .urlencode($val). "&";
			//$sign  .= "$key=$val&";

			$form_content .= "<input type='hidden' name='{$key}' value='".$val."'>\n";
			$sign  .= "$key=$val&";
		}


		$sign  = substr($sign, 0, -1) . $data_pay_key;

		$html .= "<form name='alipay_bank' action='https://mapi.alipay.com/gateway.do?_input_charset=utf-8' method='post' >\n";
		$html .= $form_content;
		$html .= "<input type='hidden' name='sign' value='".md5($sign)."'>\n";
		$html .= "<input type='hidden' name='sign_type' value='MD5'>\n";
		//$html .= "<input type='submit' value='确定支付' />\n";
		$html .= "</form>\n";
		$html .= "</body>\n";
		$html .= "</html>\n";

		return $html;
	}

	/**
     * 响应操作
     */
	function respond()
	{

		if (!empty($_POST))
		{
			foreach($_POST as $key => $data)
			{
				$_GET[$key] = $data;
			}
		}

		$payment  = $this->payment;

		/* 检查数字签名是否正确 */
		ksort($_GET);
		reset($_GET);

		$sign = '';
		foreach ($_GET AS $key=>$val)
		{
			if ($key != 'sign' && $key != 'sign_type' && $key != 'code' && $key != 'app'  && $key != 'act')
			{
				$sign .= "$key=$val&";
			}
		}

		$sign = substr($sign, 0, -1) . $payment['alipay_key'];

		if (md5($sign) != $_GET['sign'])
		{
			return -1;//签名不对，这里不写入错误日志，防止同步跳转，别人恶意攻击，写入文件，影响服务器
		}

		//获取支付宝远程服务器ATN结果（验证是否是支付宝发来的消息）
		if($_GET['act']=='async')//异步通知，更新订单状态，必须验证是不是支付接口发过来的请求
		{

			if (! empty($_GET["notify_id"]))
			{
				$responseTxt = $this->getResponse($this->payment['alipay_partner'],$_GET["notify_id"]);
			}
			if (preg_match("/true$/i",$responseTxt))
			{
				$v_result = 1;//成功
			}
			else
			{
				return -2;//验证不是支付宝发来的消息
			}
		}

		//担保交易接口 等待发货状态
		if ($_GET['trade_status'] == 'WAIT_SELLER_SEND_GOODS')
		{
			$v_result = 1;
		}//交易完成
		elseif ($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS')
		{

			$v_result = 1;

		}//交易失败
		else
		{
			$v_result = -3;
		}

		return $v_result;
	}

	/**
     * 获取远程服务器ATN结果,验证返回URL
     * @param $partner 合作者身份ID
     * @param $notify_id 通知校验ID
     * @return 服务器ATN结果
     * 验证结果集：
     * invalid命令参数不对 出现这个错误，请检测返回处理中partner和key是否为空 
     * true 返回正确信息
     * false 请检查防火墙或者是服务器阻止端口问题以及验证时间是否超过一分钟
     */
	function getResponse($partner,$notify_id)
	{

		$veryfy_url = 'http://notify.alipay.com/trade/notify_query.do?';
		$veryfy_url = $veryfy_url."partner=" . $partner . "&notify_id=" . $notify_id;
		$responseTxt = $this->getHttpResponseGET($veryfy_url, getcwd().'\\cacert.pem');
		return $responseTxt;
	}

	/**
 * 远程获取数据，GET模式
 * 注意：
 * 1.使用Crul需要修改服务器中php.ini文件的设置，找到php_curl.dll去掉前面的";"就行了
 * 2.文件夹中cacert.pem是SSL证书请保证其路径有效，目前默认路径是：getcwd().'\\cacert.pem'
 * @param $url 指定URL完整路径地址
 * @param $cacert_url 指定当前工作目录绝对路径
 * return 远程输出的数据
 */
	function getHttpResponseGET($url,$cacert_url)
	{
		$curl = curl_init($url);
		curl_setopt($curl, CURLOPT_HEADER, 0 ); // 过滤HTTP头
		curl_setopt($curl,CURLOPT_RETURNTRANSFER, 1);// 显示输出结果
		curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);//SSL证书认证
		curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);//严格认证
		curl_setopt($curl, CURLOPT_CAINFO,$cacert_url);//证书地址
		$responseText = curl_exec($curl);
		//var_dump( curl_error($curl) );//如果执行curl过程中出现异常，可打开此开关，以便查看异常内容
		curl_close($curl);

		return $responseText;
	}

	/**
     * 用于防钓鱼，调用接口query_timestamp来获取时间戳的处理函数
	 * 注意：该功能PHP5环境及以上支持，因此必须服务器、本地电脑中装有支持DOMDocument、SSL的PHP配置环境。建议本地调试时使用PHP开发软件
     * return 时间戳字符串
	 */
	function query_timestamp()
	{
		$url = "https://mapi.alipay.com/gateway.do?service=query_timestamp&partner=".$this->payment['alipay_partner']."&_input_charset=utf-8";
		$encrypt_key = "";

		$doc = new DOMDocument();
		$doc->load($url);
		$itemEncrypt_key = $doc->getElementsByTagName( "encrypt_key" );
		$encrypt_key = $itemEncrypt_key->item(0)->nodeValue;

		return $encrypt_key;
	}

	/**
	 * 获取外部交易号
	 */
	function get_out_trade_no()
	{
		return $_REQUEST['out_trade_no'];
	}

	/**
	 * 检查金额是否相符
	 * @param total_price,数据库中的订单金额
	 * @return  void
	 */
	function check_total_fee($total_price)
	{
		$order_amount = $_GET['total_fee'];
		if($total_price == $order_amount)
		return true;
		else
		return false;
	}
	/**
     * 获取订单金额
     */
	function get_total_fee()
	{
		$order_amount = $_GET['total_fee'];

		return $order_amount;
	}
	/**
     *    支付费率
     *    @param  money 订单总额
     */
	function get_pay_rate($money)
	{
		if ($money>0 && $money<60000)
		$pay_rate = 0.012;
		else if ($money>=60000 && $money<500000)
		$pay_rate = 0.01;
		else if ($money>=500000 && $money<1000000)
		$pay_rate = 0.009;
		else if ($money>=1000000 && $money<2000000)
		$pay_rate = 0.008;
		else if ($money>=2000000)
		$pay_rate = 0.007;
		return $pay_rate;

	}
	/**
     *    将验证结果反馈给网关
     *
     *    @author    Garbin
     *    @param     bool   $result
     *    @return    void
     */
	function verify_result($result)
	{
		if ($result)
		{
			echo 'success';
		}
		else
		{
			echo 'fail';
		}
	}
	/**
     *    错误消息
     */
	function error_message($num)
	{
		switch ($num)
		{
			case -1:
				$msg = '签名不对';
				break;
			case -2:
				$msg = '不是支付宝发来的消息';
				break;
			case -3:
				$msg = '验证失败';
				break;
		}
		return $msg;
	}
}

?>